/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Rozvrh;

import InformacnaStruktura.TypZmeny;
import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

/**
 * Trieda vytvárajúca objekty štandardného typu zmien komunitného centra
 * @author MartinaHlinková
 */
public class StandardnaZmena implements Zmeny {
    Sablony.Funkcia funkcia;
    InformacnaStruktura.CasBezDatumu casOd;
    InformacnaStruktura.CasBezDatumu casDo;
    InformacnaStruktura.TypZmeny typZmeny;
    
    /**
     * Konštruktor objektov triedy StandardnaZmena vytvárajúca prázdnu zmenu (jej všetky vlastnosti
     * sú nastavené na null)
     */
    public StandardnaZmena(){
        this.casDo = null;
        this.casOd = null;
        this.funkcia = null;
        this.typZmeny = null;
    }
    
    /**
     * Konštruktor objektov triedy StandardnaZmena vytvárajúca zmenu podľa funkcie zamestnanca a typu zmeny
     * @param funkcia   funkcia zamestnanca
     * @param typZmeny typ zmeny
     */
    public StandardnaZmena(Sablony.Funkcia funkcia, InformacnaStruktura.TypZmeny typZmeny){
        this.funkcia = funkcia;
        this.typZmeny = typZmeny;
        this.casDo = null;
        this.casOd = null;
        switch(funkcia){
            case KMENOVY:{
                switch(typZmeny){
                    case RANNA:{
                        this.casOd = new InformacnaStruktura.CasBezDatumu(7,0);
                        this.casDo = new InformacnaStruktura.CasBezDatumu(15, 0);
                        break;
                    }
                    case POOBEDNA:{
                        this.casOd = new InformacnaStruktura.CasBezDatumu(13,15);
                        this.casDo = new InformacnaStruktura.CasBezDatumu(19,45);
                        break;
                    }
                    case DENNA:{
                        this.casOd = new InformacnaStruktura.CasBezDatumu(7,0);
                        this.casDo = new InformacnaStruktura.CasBezDatumu(19,00);
                        break;
                    }
                    case NOCNA:
                    case NOCNA_DLHA:{
                        this.casOd = new InformacnaStruktura.CasBezDatumu(19,0);
                        this.casDo = new InformacnaStruktura.CasBezDatumu(7,0);
                        break;
                    }
                    case DOVOLENKA:{
                        this.casOd = new InformacnaStruktura.CasBezDatumu(0,0);
                        this.casDo = new InformacnaStruktura.CasBezDatumu(23,59);
                        break;
                    }
                    default:{
                        this.funkcia = null;
                        this.typZmeny = null;
                        break;
                    }
                }
                break;
            }
             case ASISTENT:{
                switch(typZmeny){
                    case RANNA:{
                        this.casOd = new InformacnaStruktura.CasBezDatumu(7,0);
                        this.casDo = new InformacnaStruktura.CasBezDatumu(15,0);
                        break;
                    }
                    case POOBEDNA:{
                        this.casOd = new InformacnaStruktura.CasBezDatumu(12,30);
                        this.casDo = new InformacnaStruktura.CasBezDatumu(20,30);
                        break;
                    }
                    case NOCNA:{
                        this.casOd = new InformacnaStruktura.CasBezDatumu(22,0);
                        this.casDo = new InformacnaStruktura.CasBezDatumu(6,0);
                        break;
                    }
                    case NOCNA_DLHA:{
                        this.casOd = new InformacnaStruktura.CasBezDatumu(18,0);
                        this.casDo = new InformacnaStruktura.CasBezDatumu(6,0);
                        break;
                    }
                    case DOVOLENKA:{
                        this.casOd = new InformacnaStruktura.CasBezDatumu(0,0);
                        this.casDo = new InformacnaStruktura.CasBezDatumu(23,59);
                        break;
                    }
                    default:{
                        this.funkcia = null;
                        this.typZmeny = null;
                        break;
                    }
                            
                }
                break;
            }
             case SKRATENY:{
                 switch(typZmeny){
                     case RANNA:{
                        this.casOd = new InformacnaStruktura.CasBezDatumu(7,0);
                        this.casDo = new InformacnaStruktura.CasBezDatumu(15,0);
                        break;
                     }
                     case KUCHYNA:{
                        this.casOd = new InformacnaStruktura.CasBezDatumu(7,0);
                        this.casDo = new InformacnaStruktura.CasBezDatumu(15,0);
                        break;
                     }
                     case DOVOLENKA:{
                        this.casOd = new InformacnaStruktura.CasBezDatumu(0,0);
                        this.casDo = new InformacnaStruktura.CasBezDatumu(23,59);
                        break;
                    }
                     default:{
                        this.funkcia = null;
                        this.typZmeny = null;
                        break;
                    }
                 }
                 break;
             } 
             case KUCHAR:{
                 switch(typZmeny){
                     case RANNA:{
                        this.casOd = new InformacnaStruktura.CasBezDatumu(7,0);
                        this.casDo = new InformacnaStruktura.CasBezDatumu(15,0);
                        break;
                     }
                     case DENNA:{
                        this.casOd = new InformacnaStruktura.CasBezDatumu(7,0);
                        this.casDo = new InformacnaStruktura.CasBezDatumu(19,0);
                        break;
                     }
                     case DOVOLENKA:{
                        this.casOd = new InformacnaStruktura.CasBezDatumu(0,0);
                        this.casDo = new InformacnaStruktura.CasBezDatumu(23,59);
                        break;
                    }
                     default:{
                        this.funkcia = null;
                        this.typZmeny = null;
                        break;
                    }
                 }
                 break;
             }
             default:{
                 this.funkcia = null;
                 this.typZmeny = null;
                 break;
             }
            }
    }
    /**
     * Metóda, ktorá vracia funkciu zamestnanca, ktorému patrí zmena
     * @return funkcia zamestnanca zmeny
     */
    public Sablony.Funkcia getFunkcia(){
        return this.funkcia;
    }
    /**
     * Metóda, ktorá vracia čas odkedy trvá zmena
     * @return čas odkedy trvá zmena
     */
    @Override
    public InformacnaStruktura.CasBezDatumu getCasOd(){
        return this.casOd;
    }
    /**
     * Metóda, ktorá vracia čas dokedy trvá zmena
     * @return čas dokedy trvá zmena
     */
    @Override
    public InformacnaStruktura.CasBezDatumu getCasDo(){
        return this.casDo;
    }
    /**
     * 
     * @return 
     */
    @Override
    public InformacnaStruktura.CasBezDatumu pocetHodinVCentre(){
        int pocetMinut = InformacnaStruktura.CasBezDatumu.zmerajCasNaMinuty(casOd, casDo);
        if(pocetMinut < 0 )return null;
        int hodiny = (int)(pocetMinut/60);
        int minuty = (int)(pocetMinut%60);
        InformacnaStruktura.CasBezDatumu navrat = new InformacnaStruktura.CasBezDatumu(hodiny, minuty);
        return navrat;
    }
    
    @Override
    public int pocetMinutPrestavky(){
        InformacnaStruktura.CasBezDatumu pocetHodin = this.pocetHodinVCentre();
        if(pocetHodin == null)return 0;
        if(pocetHodin.getHodiny() < 4 ||(pocetHodin.getHodiny() == 4 && pocetHodin.getMinuty() == 0)) return 0;
        if(pocetHodin.getHodiny() < 8 ||(pocetHodin.getHodiny() == 8 && pocetHodin.getMinuty() == 0)) return 30;
        return 45;
    }
    
    @Override
    public InformacnaStruktura.CasBezDatumu getOdpracovanyCas(){
        int prestavka = this.pocetMinutPrestavky();
        InformacnaStruktura.CasBezDatumu cas = this.pocetHodinVCentre();
        if(cas.getMinuty()<prestavka){
            return new InformacnaStruktura.CasBezDatumu(cas.getHodiny()-1,cas.getMinuty()-prestavka +60);
        }else{
            return new InformacnaStruktura.CasBezDatumu(cas.getHodiny(),cas.getMinuty()-prestavka);
        }
    }

    @Override
    public TypZmeny getTypZmeny() {
       return this.typZmeny;
    }

    @Override
    public String casToString() {
        return  ""+ this.casOd.toString()+"\r\n"+this.casDo.toString();
    }
    
    @Override
    public String toString(){
        String navrat = "";
        if(this.funkcia == null){
            navrat = navrat+"null:";
        }else{
            navrat = navrat +this.funkcia +":";
        }
        if(this.typZmeny == null){
            navrat = navrat+"null:";
        }else{
            navrat = navrat+this.typZmeny+":";
        }
        if(this.casOd == null){
            navrat = navrat+"null:";
        }else{
            navrat = navrat+this.casOd.toString()+":";
        }
        if(this.casDo == null){
            navrat = navrat+"null";
        }else{
            navrat = navrat+this.casDo.toString();
        }
        return navrat;
    }

    @Override
    public Element zmenaDoElementu(Document doc) {
        Element zmena = doc.createElement("zmena");
        Attr attrStandard = doc.createAttribute("standard");
        zmena.setAttributeNode(attrStandard);
                                        
        Attr attrFunkcia = doc.createAttribute("funkcia");
        attrFunkcia.setNodeValue(""+this.funkcia);
        zmena.setAttributeNode(attrFunkcia);
                                        
        Attr attrTypZmeny = doc.createAttribute("typZmeny");
        attrTypZmeny.setNodeValue(""+this.typZmeny);
        zmena.setAttributeNode(attrTypZmeny);
        
        return zmena;
    }

    /**
     * Metóda, ktorá načíta zmenu z JavaDOM elementu
     * @param element JavaDOM element so štandardnou zmenou
     * @return načítaná štandardná zmena
     */
    public static Zmeny nacitajZmenu(Element element) {
        if(element == null)return null;
        if(element.hasAttribute("standard") == false ||
            element.hasAttribute("funkcia") == false || element.hasAttribute("typZmeny") == false)return null;
        String stringFunkcia = element.getAttribute("funkcia");
        String stringTyp = element.getAttribute("typZmeny");
        Sablony.Funkcia funkcia = null;
        InformacnaStruktura.TypZmeny typ = null;
        
        Sablony.Funkcia funkcie[] = Sablony.Funkcia.values();
        for(Sablony.Funkcia iterator:funkcie){
            if(stringFunkcia.equals(iterator.toString())){
                funkcia = iterator;
            }
        }
        
        InformacnaStruktura.TypZmeny typy[] = InformacnaStruktura.TypZmeny.values();
        for(InformacnaStruktura.TypZmeny iterator: typy){
            if(stringTyp.equals(iterator.toString())){
                typ = iterator;
            }
        }
        
        if(typ == null || funkcia == null) return null;
        Zmeny navrat = new StandardnaZmena(funkcia,typ);
        return navrat;
    }
    
 
}
